// 作业讲解

// 简述 bind、call、apply 的作用及区别。

// bind、call、apply 的区别

// 一、相同点
// 1. 三个都是用于改变this指向
// 2. 接收的第一个参数都是this要指向的对象
// 3. 都可以利用后续参数传参

// 二、不同点
// 1. call和bind传参相同，多个参数依次传入的，而apply只有两个参数，第二参数为数组。
// 2. call和apply都是对函数进行直接调用，而bind不会立即调用，而是返回一个修改this之后对函数。

// 1、call的用法
// 语法：fn.call(thisArg, arg1, arg2, …)

let zhangfeng = {
    name: "张奉",
    age: 18,
    sayHello(job, hobby) {
        console.log("我叫" + this.name + "，今年" + this.age + "岁。我的工作是：" + job + "，我的爱好是：" + hobby + "。");
    }
};

zhangfeng.sayHello("IT工程师", "配音");

let luoyue = {
    name: "罗月",
    age: 19
};

zhangfeng.sayHello.call(luoyue, "教师", "跳舞");

// 上述代码中，luoyue对象也想使用zhangfeng对象中的sayHello方法，
// 我们可以使用call方法调用zhangfeng.sayHello，并将zhangfeng.sayHello
// 下的this修改为luoyue对象，最后再把"教师", "跳舞"这个参数传给zhangfeng.sayHello

// 2、apply的用法
// 语法：fn.apply(thisArg, [arg1, arg2, …])

zhangfeng.sayHello.apply(luoyue, ["教师", "跳舞"]);

// apply和call区别在于传参数形式不同。apply接受两个参数，第一个参数是要指向的this对象
// 第二个参数是一个数组，数组里面的元素会被展开传入sayHello，作为sayHello的参数。

// 3. bind的用法
// 语法：fn.bind(thisArg, arg1, arg2, …)

zhangfeng.sayHello.bind(luoyue, "教师", "跳舞");

// bind作用只修改this指向，但不会立即执行函数sayHello，会返回一个修改了this指向后的函数
// 需要调用才会执行。bind传参和call相同。

zhangfeng.sayHello.bind(luoyue, "教师", "跳舞")();
